package fr.univ.colloque.servlet;

import fr.univ.colloque.dao.ColloqueDao;
import fr.univ.colloque.data.Colloque;
import fr.univ.colloque.data.Personne;
import fr.univ.colloque.util.Link;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class ClotureColloque extends HttpServlet
{

    // Messages d'erreur
    private static String ERR_DATE_ABS = "Saisie invalide";
    private static String ERR_DATE_FORMAT = "Format de date invalide. ( dd/mm/yyyy )";
    private static String ERR_DATE_APRES = "La date de fin doit être postérieure à la date de début";
    private static String ATTR_SESSION_COLLOQUE = "colloque";

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
        HttpSession session = req.getSession();

        Personne connecte = (Personne) session.getAttribute("user");

        Link lien = Link.FORM_COLLOQUE_NON_CLOTURE;

        if (connecte == null || !lien.getType().equals(connecte.getType()))
        {
            // La personne connecté n'a pas les droits nécessaires pour accéder à cette page
            resp.sendRedirect("indexCo.jsp?e=1");
        }
        else
        {
            String idStr = req.getParameter("id");
            int id = Integer.parseInt(idStr);

            ColloqueDao coDao = new ColloqueDao();
            Colloque co = coDao.get(id, false);

            session.setAttribute(ATTR_SESSION_COLLOQUE, co);
            // Page qu'il va mettre dans la partie à droite du menu
            req.setAttribute("page", lien);
            // Redirige vers la page gabarit
            req.getRequestDispatcher("indexCo.jsp").forward(req, resp);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
        HttpSession session = req.getSession();

        Colloque co = (Colloque) session.getAttribute(ATTR_SESSION_COLLOQUE);

        String action = req.getParameter("action");

        if (action != null && "Annuler".equals(action))
        {
            // On doit supprimer l'objet colloque de la session
            session.removeAttribute(ATTR_SESSION_COLLOQUE);

            // Redirection vers liste des non cloturé
            Link lien = Link.LISTE_COLLOQUE_NON_CLOTURE;

            // Utilisation de sendRedirect pour permettre le recalcul de la liste des colloques non cloturés
            resp.sendRedirect(lien.getLien());

        }
        else
        {

            String dateStr = (String) req.getParameter("dtFin");
            boolean erreur = false;

            List<String> listeErr = new ArrayList<String>();

            SimpleDateFormat sf = new SimpleDateFormat("dd/MM/yyyy");
            Date dateClos = null;

            if (dateStr == null || dateStr.equals(""))
            {
                erreur = true;
                listeErr.add(ERR_DATE_ABS);
            }
            else
            {
                try
                {
                    // Transforme la date saisie en format Date 
                    // Renvoie une exception si le format n'est pas respecté
                    dateClos = sf.parse(dateStr);

                    if (!dateClos.after(co.getDateOuvertureDepot()))
                    {
                        erreur = true;
                        listeErr.add(ERR_DATE_APRES);
                    }
                }
                catch (ParseException pe)
                {
                    erreur = true;
                    listeErr.add(ERR_DATE_FORMAT);
                }
            }

            if (erreur)
            {
                req.setAttribute("err", listeErr);

                // on redirige vers la page fDateFin pour afficher le message d erreur
                Link lien = Link.FORM_COLLOQUE_NON_CLOTURE;

                // Page qu'il va mettre dans la partie à droite du menu
                req.setAttribute("page", lien);
                // Redirige vers la page gabarit
                req.getRequestDispatcher("indexCo.jsp").forward(req, resp);
            }
            else
            {
                // Pas d'erreur on traite la saisie du formulaire

                co.setDateClotureDepot(dateClos);

                // Réalisation de l'update
                ColloqueDao cDao = new ColloqueDao();
                cDao.update(co);

                // On doit supprimer l'objet colloque de la session
                session.removeAttribute(ATTR_SESSION_COLLOQUE);

                // Redirection vers liste des non cloturé
                Link lien = Link.LISTE_COLLOQUE_NON_CLOTURE;

                // Utilisation de sendRedirect pour permettre le recalcul de la liste des colloques non cloturés
                resp.sendRedirect(lien.getLien());
            }
        }
    }
}
